package com.gdones.bootserver.bus.account.controller;


import cn.hutool.crypto.digest.DigestUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gdones.bootserver.bus.account.dto.Account;
import com.gdones.bootserver.bus.account.dto.ChangePwdAccountDTO;
import com.gdones.bootserver.bus.account.dto.LoginDto;
import com.gdones.bootserver.bus.account.service.IAccountService;
import com.gdones.common.core.annotations.MySysLog;
import com.gdones.common.core.annotations.MySysLogOpration;
import com.gdones.common.core.dto.MyPageBand;
import com.gdones.common.core.dto.MyPager;
import com.gdones.common.core.dto.MyResult;
import com.gdones.bootserver.core.util.MyRedisUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

/**
 *
 * 账号管理
 * @author GaoJingBo
 * @since 2023-03-17
 */
@RestController
@RequestMapping("/account")
@Slf4j
@Api(tags = "用户管理接口")
public class AccountController {

    @Resource(name = "accountServiceImpl")
    private IAccountService accountService;

    @Autowired
    private MyRedisUtil redisUtil;


    /**
     *  检查是否需要行为验证码
     * @param dto 登录实体信息
     * @return 返回或转发信息行为验证码内容
     */
    @PostMapping("/checkIsUseXwyz")
    @ApiOperation("检查是否需要开启行为验证码")
    @MySysLog(modelName="用户管理",methodDesc = "检查是否需要开启行为验证码",methodType = MySysLogOpration.POST)
    public MyResult checkIsUseXwyz(@RequestBody LoginDto dto){
        log.debug("--用户管理模块：检查是否需要开启行为验证码");
        MyResult result = new MyResult();

        Object isUseXwyz = redisUtil.get("xwyz#" + dto.getUserName());

        if(isUseXwyz==null){// 不需要行为验证码
            dto.setChecked(true);
            result = doLoging(dto); // 进入登录

        }else{
            result.setMsg("需要开启行为验证码!");
            result.setCode("-4");
        }

        return result;
    }

    /**
     * 登录请求
     * @param dto 登录参数
     * @return
     */
    @PostMapping("/doLogin")
    @ApiOperation("登录功能")
    @MySysLog(modelName="用户管理",methodDesc = "登录功能",methodType = MySysLogOpration.POST)
    public MyResult doLoging(@RequestBody LoginDto dto){
        log.debug("--用户管理模块：用户登录");

        MyResult result = new MyResult();

        log.info("--- 验证码----localID:"+dto.getLocalID());
        Object code = redisUtil.get("regCode#" + dto.getLocalID());
        if(code==null){ //验证码过期
            result.setMsg("验证码过期");
            result.setCode("-2");
            return result;
        }else{ //验证码判断

            String sys_reqcode = (String) code;

            if (!dto.getReqCode().equalsIgnoreCase(sys_reqcode)){// 验证码错误
                result.setMsg("验证码错误！");
                result.setCode("9999");
                return result;
            }
        }

        // 进行行为验证码的判断
        if(!dto.isChecked()){
            result.setMsg("非法操作！");
            result.setCode("9999");
            return result;
        }


        // 判断成功后进入用户名秘密验证
        result = accountService.doLogin(dto);


        return result;

    }

    /**
     * 用户管理模块：用户分页查询
     * @param account
     * @param pageBand
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("用户分页查询")
    @MySysLog(modelName="用户管理",methodDesc = "用户分页查询",methodType = MySysLogOpration.GET)
    public MyResult page(Account account, MyPageBand pageBand){
        log.debug("--用户管理模块：用户分页查询");

        MyResult result = new MyResult();

        try {
            MyPager<Account> res = accountService.myPage(account,pageBand);

            result.setMsg("查询成功！");
            result.setData(res);
        }catch (Exception e){
            result.setMsg("分页查询异常！");
            result.setCode("9999");
        }


        return result;

    }

    /**
     * 获取用户信息通过主键id
     * @param id
     * @return
     */
    @GetMapping("/getDataByID")
    @ApiOperation("获取用户信息通过主键id")
    @MySysLog(modelName="用户管理",methodDesc = "获取用户信息通过主键id",methodType = MySysLogOpration.GET)
    public MyResult page(String id){
        log.debug("--用户管理模块：获取用户信息通过主键id");

        MyResult result = new MyResult();

        try {
            Account byId = accountService.getById(id);

            result.setMsg("查询成功！");
            result.setData(byId);
        }catch (Exception e){
            result.setMsg("获取用户信息通过主键id-查询异常！");
            result.setCode("9999");
        }

        return result;

    }


    /**
     * 新增（注册）
     * @param account
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("用户-新增（注册）")
    @MySysLog(modelName="用户管理",methodDesc = "新增（注册）",methodType = MySysLogOpration.POST)
    public MyResult add(@RequestBody Account account){
        log.debug("--用户管理模块：新增（注册）");

        MyResult result = new MyResult();

        try {

            // 验证一下是否有同名的用户
            QueryWrapper<Account> updateWrapper = new QueryWrapper<>();
            updateWrapper.eq("userName",account.getUserName());
            Account one = accountService.getOne(updateWrapper);
            if(one!=null){// 已经存在相同用户名账号
                result.setMsg("【"+account.getUserName()+"】已存在，请从新设置用户名！");
                result.setCode("9999");
                return result;
            }

            // 密码加密
            account.setAcpwd(DigestUtil.md5Hex(account.getAcpwd()));

            boolean save = accountService.save(account);
            if(save){
                result.setMsg("添加成功！");
            }else{
                result.setMsg("添加失败！");
                result.setCode("9999");
            }
        }catch (Exception e){
            result.setMsg("新增异常！");
            result.setCode("9999");
        }


        return result;

    }

    /**
     * 修改
     * @param account
     * @return
     */
    @PutMapping("/update")
    @ApiOperation("用户-修改")
    @MySysLog(modelName="用户管理",methodDesc = "修改",methodType = MySysLogOpration.PUT)
    public MyResult update(@RequestBody Account account){
        log.debug("--用户管理模块：修改");

        MyResult result = new MyResult();

        try {
            boolean udpate = accountService.updateById(account);
            if(udpate){
                result.setMsg("修改成功！");
            }else{
                result.setMsg("修改失败！");
                result.setCode("9999");
            }
        }catch (Exception e){
            result.setMsg("修改异常！");
            result.setCode("9999");
        }

        return result;
    }

    /**
     * 删除
     * @param accountIDs 同时支持单个删除和批量删除
     *                   如果传递的是逗号分隔的id 如： XXX1,XXX2,XXX3
     * @return
     */
    @DeleteMapping("/delete")
    @ApiOperation("用户-删除")
    @MySysLog(modelName="用户管理",methodDesc = "删除",methodType = MySysLogOpration.DELETE)
    public MyResult delete(String accountIDs){
        log.debug("--用户管理模块：删除");

        MyResult result = new MyResult();

        try {

            boolean isDeleteOk = false;

            String[] idsArr = accountIDs.split(",");

            if(idsArr.length>1){// 需要批量删除

                // 将数组转集合
                List<String> strings = Arrays.asList(idsArr);

                isDeleteOk = accountService.removeBatchByIds(strings);

            }else{//单个删除
                isDeleteOk = accountService.removeById(accountIDs);
            }
            if(isDeleteOk){
                result.setMsg("删除成功，【"+idsArr.length+"】条数据删除！");
            }else{
                result.setMsg("删除失败！");
                result.setCode("9999");
            }

        }catch (Exception e){
            e.printStackTrace();
            result.setMsg("删除异常！");
            result.setCode("9999");
        }

        return result;
    }

    /**
     * 解除锁定
     * @param accountIDs  同时支持单个和批量用户解锁  如果传递的是逗号分隔的id 如： XXX1,XXX2,XXX3
     * @return
     */
    @PostMapping("/unLockAccounts")
    @ApiOperation("用户-解除锁定")
    @MySysLog(modelName="用户管理",methodDesc = "解除锁定",methodType = MySysLogOpration.POST)
    public MyResult unLockAccounts(String accountIDs){
        log.debug("--用户管理模块：解除锁定");

        MyResult result = new MyResult();

        try {

            result = accountService.unLockAccounts(accountIDs);

        }catch (Exception e){
            result.setMsg("解除锁定异常！");
            result.setCode("9999");
        }

        return result;
    }

    /**
     * 修改用户密码
     * @param dto
     * @return
     */
    @PutMapping("/changeAccountPwd")
    @ApiOperation("用户-修改用户密码")
    @MySysLog(modelName="用户管理",methodDesc = "修改用户密码",methodType = MySysLogOpration.PUT)
    public MyResult changeAccountPwd(@RequestBody ChangePwdAccountDTO dto){
        log.debug("--用户管理模块：修改用户密码");

        MyResult result = new MyResult();

        try {

            result = accountService.changeAccountPwd(dto);

        }catch (Exception e){
            result.setMsg("修改用户密码异常！");
            result.setCode("9999");
        }

        return result;
    }

    @GetMapping("/getUserAllSysData")
    @ApiOperation("获取完整用户信息（菜单、角色、数据权限）")
    @MySysLog(modelName="用户管理",methodDesc = "获取完整用户信息（菜单、角色、数据权限）",methodType = MySysLogOpration.GET)
    public MyResult getUserAllSysData(String accountID){
        log.info("--- 用户管理：获取完整用户信息（菜单、角色、数据权限）");

        MyResult result = new MyResult();

        try{
            result = accountService.getUserAllSysData(accountID);
        }catch (Exception e){
            e.printStackTrace();
            result.setMsg("获取完整用户信息操作异常");
            result.setCode("9999");
        }

        return result;
    }

    @GetMapping("/getNotGranteStaffAccountList")
    @ApiOperation("查询未被授权给管理员的账号列表")
    @MySysLog(modelName="用户管理",methodDesc = "查询未被授权给管理员的账号列表",methodType = MySysLogOpration.GET)
    public MyResult getNotGranteStaffAccountList(Account dto){

        log.info("--- 用户管理：查询未被授权给管理员的账号列表");

        MyResult result = new MyResult();

        try{
            result = accountService.getNotGranteStaffAccountList(dto);
        }catch (Exception e){
            e.printStackTrace();
            result.setMsg("查询未被授权给管理员的账号列表操作异常");
            result.setCode("9999");
        }

        return result;

    }

}
